Code to run analysis and generate figures for McNeall et al. (2023) “Constraining the carbon cycle in JULES-ES-1.0”
What are the data?
Failure analysis

Failure analysis marginal plots
Are there hard thresholds after which the model always fails? (Question from review comments). Run failures are in t
null device
1
## Is there a pattern to the wave01 timeseries outliers?
null device
1
Visualising the ensemble range
It’s important to remember that the design of the experiment is multiplication factors of the original parameters. This might be important for the “hold” value in a sensitivity analysis, as the “standard” value and the median value of the ensemble will not be the same.

Wave00/Wave01 Ensemble behaviour in key (constraining) outputs.
Global mean for the 20 years at the end of the 20th Century. There is still a significant low bias on cVeg output.

What proportion of wave01 fall within Andy Wiltshire’s constraints?
Just under a third. Points at a significant model discrepency in cVeg
Of the 400 members of the wave01 ensemble, 128 pass Andy Wiltshire’s Level 2 constraints.
[1] 128
[1] 0.32
null device
1
null device
1
Exploring summary of constraint: Cumulative NBP
Carbon budget data
Section 2.5 in Friedlingstein et al. describes how the land carbon sink is estimated.
IPCC AR6 Chapter 5 states: “The net land carbon sink is taken as net biome productivity (NBP) and so includes any modelled net land-use change emissions. Further details on data sources and processing are available in the chapter data table (Table 5.SM.6).”
The GCP says: “The land sink is the average of several dynamic global vegetation models that reproduce the observed mean total land sink of the 1990s.”
AR6 Chapter 5 states: "The land carbon cycle components of historical ESM simulations show a larger range, with simulated cumulative land carbon uptake (1850–2014) spanning the range from –47 to +21 GtC, compared to the GCP estimate of –12 ± 50 GtC (Figure 5.23b).




How much are all select output constrained?

Constraint of output at level 2
Proportion of the initial range of model output that is covered by level 2 constrained ensemble (%):
npp nbp cSoil cVeg lai_lnd_mean rh_lnd_sum
26.6 55.1 48.3 23.5 60.9 26.0
fLuc_lnd_sum fHarvest_lnd_sum treeFrac_lnd_mean shrubFrac_lnd_mean baresoilFrac_lnd_mean c3PftFrac_lnd_mean
51.5 60.7 88.3 85.4 52.9 58.0
c4PftFrac_lnd_mean
43.9
null device
1
Pairs plot of 2d projections of constrained output space.

Constraining to level 2 with the emulator

LS0tCnRpdGxlOiAiQ29uc3RyYWluaW5nIHRoZSBjYXJib24gY3ljbGUgaW4gSlVMRVMtRVMtMS4wIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6ICcyJwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgdG9jX2RlcHRoOiAyCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwotLS0KCgpDb2RlIHRvIHJ1biBhbmFseXNpcyBhbmQgZ2VuZXJhdGUgZmlndXJlcyBmb3IgTWNOZWFsbCBldCBhbC4gKDIwMjMpICJDb25zdHJhaW5pbmcgdGhlIGNhcmJvbiBjeWNsZSBpbiBKVUxFUy1FUy0xLjAiCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHMgPSAnaGlkZSd9CiMgTG9hZCBoZWxwZXIgZnVuY3Rpb25zCgprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLnBhdGggPSAiZmlncy8iLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZ3MgPSBGQUxTRSkKCgpgYGAKCmBgYHtyfQoKc291cmNlKCJKVUxFUy1FUy0xcDAtY29tbW9uLXBhY2thZ2VzLlIiKQpzb3VyY2UoIkpVTEVTLUVTLTFwMC1jb21tb24tZnVuY3Rpb25zLlIiKQpzb3VyY2UoIkpVTEVTLUVTLTFwMC1jb21tb24tZGF0YS5SIikKCmBgYAoKIyMgV2hhdCBhcmUgdGhlIGRhdGE/CmBgYHtyfQpnZXRTdGFuZGFyZE1lbWJlckxvbmdOYW1lIDwtIGZ1bmN0aW9uKGVuc2xvYywgdmFyaWFibGUpewogICMgSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgbG9uZyBuYW1lIG9mIG91dHB1dCB2YXJpYWJsZXMgKGFuZCB0aGUgdW5pdHMpCiAgCiAgZW5zbWVtYmVyIDwtICdTMycKICBmbiA8LSBwYXN0ZTAoZW5zbG9jLCdKVUxFUy1FUy0xcDBfJyxlbnNtZW1iZXIsJ19Bbm51YWxfZ2xvYmFsLm5jJykKCiAgbmMgPC0gbmNfb3BlbihwYXN0ZTAoZm4pKQogIGxuIDwtIG5jJHZhcltbdmFyaWFibGVdXSRsb25nbmFtZQogIHVuIDwtIG5jJHZhcltbdmFyaWFibGVdXSR1bml0cyAgICAgIAogIAogIHJldHVybihsaXN0KGxvbmduYW1lID0gbG4sIHVuaXRzID0gdW4pKQogIAp9CgojIGZvcihpIGluIHlfbmFtZXNfc2VsZWN0KXsKIyAgIAojICAgb3V0IDwtIGdldFN0YW5kYXJkTWVtYmVyTG9uZ05hbWUoZW5zbG9jX3dhdmUwMCwgaSkKIyAgIHByaW50KGkpCiMgICBwcmludChvdXQpCiMgfQoKYGBgCgoKCiMjIEZhaWx1cmUgYW5hbHlzaXMKCmBgYHtyIGZhaWx1cmUtcGFpcnMsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMiwgZmlnLnBhdGg9J2ZpZ3MvJywgZGV2PWMoJ3BuZycsICdwZGYnKX0KCgpsb3dfbnBwX2l4IDwtIHdoaWNoKFlbLCducHBfbmxpbV9sbmRfc3VtJ10gPCAxZTUpCiMgY29kZSBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI4MTgyODcyL2hvdy10by11c2UtZGlmZmVyZW50LXNldHMtb2YtZGF0YS1pbi1sb3dlci1hbmQtdXBwZXItcGFuZWwtb2YtcGFpcnMtZnVuY3Rpb24taW4KCgojWCA8LSBtYXRyaXgocnVuaWYoMzAwKSwgbmNvbD0zKQojWSA8LSBtYXRyaXgoYyhzb3J0KHJ1bmlmKDEwMCwgMCwgMTApKSwgCiMgICAgICAgICAgICAgIHNvcnQocnVuaWYoMTAwLCAwLCAxMCkpLCAKIyAgICAgICAgICAgICAgc29ydChydW5pZigxMDAsIDAsIDEwKSkpLCBuY29sPTMpCgojcGRmKGZpbGUgPSAnZmlncy9maWcwMi5wZGYnLCB3aWR0aCA9IDEyLCBoZWlnaHQgPSAxMCkKI3BkZihmaWxlID0gJ2ZpZ3MvcnVuLWZhaWx1cmUtcGFpcnMucGRmJywgd2lkdGggPSAxMiwgaGVpZ2h0ID0gMTApCngxIDwtIFhbbG93X25wcF9peCwgXQp4MiA8LSBYX25sZXZlbDAKClhZIDwtIHJiaW5kKHgxLCB4MikKCgpwYWlycyhYWSwKICAgICAgbG93ZXIucGFuZWw9ZnVuY3Rpb24oeCwgeSwgLi4uKSB7CiAgICAgICAgWHggPC0geFtzZXFfbGVuKG5yb3coeDEpKV0gIyBjb3JyZXNwb25kcyB0byBYIHN1YnNldAogICAgICAgIFh5IDwtIHlbc2VxX2xlbihucm93KHgxKSldICMgY29ycmVzcG9uZHMgdG8gWCBzdWJzZXQKICAgICAgICAjdXNyIDwtIHBhcigidXNyIik7IG9uLmV4aXQocGFyKHVzcikpCiAgICAgICAgI3Bhcih1c3IgPSBjKHJhbmdlKHgxWywgLW5jb2woeDEpXSksIHJhbmdlKHgxWywgLTFdKSkpICMgc2V0IHVwIGxpbWl0cwogICAgICAgIHBvaW50cyhYeCwgWHksIGNvbCA9IHpibHVlLCBwY2ggPSAxOSwgY2V4ID0gMC44KQogICAgICAgIyBpZihwYXIoJ21mZycpWzJdID09IDEpIGF4aXMoMikgIyBpZiBsZWZ0IHBsb3QsIGFkZCBsZWZ0IGF4aXMKICAgICAgICAjaWYocGFyKCdtZmcnKVsxXSA9PSBuY29sKHgxKSkgYXhpcygxKSAjIGlmIGJvdHRvbSBwbG90IGFkZCBib3R0b20gYXhpcwogICAgICB9LCAKICAgICAgdXBwZXIucGFuZWw9ZnVuY3Rpb24oeCwgeSwgLi4uKSB7CiAgICAgICAgWXggPC0geFsobnJvdyh4MSkgKyAxKTpsZW5ndGgoeCldICMgWSBzdWJzZXQKICAgICAgICBZeSA8LSB5Wyhucm93KHgxKSArIDEpOmxlbmd0aCh5KV0gIyBZIHN1YnNldAogICAgICAgIAogICAgICAgICNjbnRyIDwtIG91dGVyKFl4LCBZeCwgRlVOPScqJykgIyBhcmJpdHJhcnkgZnVuY3Rpb24gZm9yIGNvbnRvdXIKICAgICAgICMgdXNyIDwtIHBhcigidXNyIik7IG9uLmV4aXQocGFyKHVzcikpCiAgICAgICAgI3Bhcih1c3IgPSBjKHJhbmdlKHgyWywgLTFdKSwgcmFuZ2UoeDJbLCAtbmNvbCh4MildKSkpICMgc2V0IHVwIGxpbWl0cwogICAgICAgIHBvaW50cyhZeCwgWXksIGNvbCA9IHpyZWQsIHBjaCA9IDE5LCBjZXggPSAwLjgpCiAgICAgICAgI2NvbnRvdXIoWXgsIFl5LCBjbnRyLCBhZGQ9VFJVRSkKICAgICAgICAjaWYocGFyKCdtZmcnKVsyXSA9PSBuY29sKHgyKSkgYXhpcyg0KSAjIGlmIHJpZ2h0IHBsb3QsIGFkZCByaWdodCBheGlzCiAgICAgICAgI2lmKHBhcignbWZnJylbMV0gPT0gMSkgYXhpcygzKSAjIGlmIHRvcCBwbG90LCBhZGQgdG9wIGF4aXMKICAgICAgfSwgCiAgICAgICN0aWNrPUZBTFNFLCAjIHN1cHByZXNzIHRoZSBkZWZhdWx0IHRpY2sgbWFya3MKICAgICAgI2xpbmU9MSwKICAgICAgZ2FwID0gMCwKICAgICAgeGxpbSA9IGMoMCwxKSwgeWxpbSA9IGMoMCwxKSwKICAgICAgbGFiZWxzID0gMTpkLAogICAgICBvbWEgPSBjKDIsIDE4LCAyLCAyKSkgIyBtb3ZlIHRoZSBkZWZhdWx0IHRpY2sgbGFiZWxzIG9mZiB0aGUgcGxvdCAKCnJlc2V0KCkKCmxlZ2VuZCgnbGVmdCcsIGxlZ2VuZCA9IHBhc3RlKDE6ZCwgY29sbmFtZXMobGhzKSksIGNleCA9IDEuMSwgYnR5ID0gJ24nKQpsZWdlbmQoJ3RvcGxlZnQnLCBwY2ggPSAxOSwgY29sID0gYyggenJlZCwgemJsdWUpLCBsZWdlbmQgPSBjKCdmYWlsZWQnLCAnemVybyBjYXJib24gY3ljbGUnKSwgYnR5ID0gJ24nLCBpbnNldCA9IDAuMDIsIGNleCA9IDEuMSApCgojZGV2Lm9mZigpCgpgYGAKCgojIyBGYWlsdXJlIGFuYWx5c2lzIG1hcmdpbmFsIHBsb3RzIAoKQXJlIHRoZXJlIGhhcmQgdGhyZXNob2xkcyBhZnRlciB3aGljaCB0aGUgbW9kZWwgYWx3YXlzIGZhaWxzPyAoUXVlc3Rpb24gZnJvbSByZXZpZXcgY29tbWVudHMpLgpSdW4gZmFpbHVyZXMgYXJlIGluIHQKCmBgYHtyLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDEwfQoKCnlfbGV2ZWwwIDwtIFlfbGV2ZWwwWywnbnBwX25saW1fbG5kX3N1bSddCgpwZGYoZmlsZSA9ICdmaWdzL21hcmdpbmFsX2ZhaWx1cmVzLnBkZicsIHdpZHRoID0gMTAsIGhlaWdodCA9IDEwKQpwYXIobWZyb3cgPSBjKDUsNyksIG1hciA9IGMoMywxLDMsMSksIG9tYSA9IGMoMSwxLDUsMSkpCmZvcihpIGluIDE6cCl7CiAgcGxvdChYX2xldmVsMFssaV0sIHlfbGV2ZWwwLCB4bGFiID0gJycsIHlsYWIgPSAnJywgbWFpbiA9IGNvbG5hbWVzKFhfbGV2ZWwwKVtpXSwgeGxpbSA9IGMoMCwxKSkKICBwb2ludHMoWF9ubGV2ZWwwWyxpXSwgcmVwKDAsIG5yb3coWF9ubGV2ZWwwKSksIGNvbCA9IHpyZWQsIHBjaCA9IDE5KQogIHBvaW50cyh4MVssIGkgXSwgcmVwKDAsbnJvdyh4MSkpLCBjb2wgPSB6Ymx1ZSwgcGNoID0gMTkpCiAgCn0KbXRleHQoJ05QUCcsIG91dGVyID0gVFJVRSwgc2lkZSA9IDMsIGNleCA9IDIsIGxpbmUgPSAyKQpyZXNldCgpCmxlZ2VuZCgnYm90dG9tcmlnaHQnLCBwY2ggPSAxOSwgY29sID0gYygnYmxhY2snLCB6cmVkLCB6Ymx1ZSksIGxlZ2VuZCA9IGMoJ3JhbicsJ2ZhaWxlZCcsICd6ZXJvIGNhcmJvbiBjeWNsZScpLCBidHkgPSAnbicsIGluc2V0ID0gMC4wNSwgY2V4ID0gMS4xICkKZGV2Lm9mZigpCgpgYGAKCiAjIyBJcyB0aGVyZSBhIHBhdHRlcm4gdG8gdGhlIHdhdmUwMSB0aW1lc2VyaWVzIG91dGxpZXJzPwpgYGB7ciwgZmlnLndpZHRoPSAxMiwgZmlnLmhlaWdodCA9IDEyfQoKcGRmKGZpbGUgPSAnZmlncy9YX3dhdmUwMV90aW1lc2VyaWVzX291dGxpZXJzLnBkZicsIHdpZHRoID0gMTIsIGhlaWdodCA9IDEyKQpwYWlycyhYX3dhdmUwMV90cmFpblt0c19vdXRsaWVyc19peF93YXZlMDEsIF0sCiAgICAgIGdhcCA9IDAsIAogICAgICB4bGltID0gYygwLDEpLAogICAgICB5bGltID0gYygwLDEpCikKZGV2Lm9mZigpCiAgICAgIAogICAgICAKCgpgYGAKCgoKCiMgVmlzdWFsaXNpbmcgdGhlIGVuc2VtYmxlIHJhbmdlCgpJdCdzIGltcG9ydGFudCB0byByZW1lbWJlciB0aGF0IHRoZSBkZXNpZ24gb2YgdGhlIGV4cGVyaW1lbnQgaXMgbXVsdGlwbGljYXRpb24gZmFjdG9ycyBvZiB0aGUgb3JpZ2luYWwgcGFyYW1ldGVycy4gVGhpcyBtaWdodCBiZSBpbXBvcnRhbnQgZm9yIHRoZSAiaG9sZCIgdmFsdWUgaW4gYSBzZW5zaXRpdml0eSBhbmFseXNpcywgYXMgdGhlICJzdGFuZGFyZCIgdmFsdWUgYW5kIHRoZSBtZWRpYW4gdmFsdWUgb2YgdGhlIGVuc2VtYmxlIHdpbGwgbm90IGJlIHRoZSBzYW1lLgoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5oZWlnaHQgPSA4fQoKI3BkZihmaWxlID0gJ2ZpZ3MvbGhzX3JhbmdlLnBkZicsIHdpZHRoID0gNiwgaGVpZ2h0ID0gOCkKI3BkZihmaWxlID0gJ2ZpZ3MvZmlnMDEucGRmJywgd2lkdGggPSA2LCBoZWlnaHQgPSA4KQpwYXIobGFzID0gMSwgbWFyID0gYyg1LDgsMiwxKSkKbGhzX21pbiA8LSBhcHBseShsaHNfd2F2ZTBfd2F2ZTAxX2FsbCwgMiwgbWluKQpsaHNfbWF4IDwtIGFwcGx5KGxoc193YXZlMF93YXZlMDFfYWxsLDIsIG1heCkKCnBsb3QobGhzX21heCwgMTpkLCB0eXBlID0gJ24nLCB4bGltID0gYygwLDEwKSwgYXhlcyA9IEZBTFNFLCB4bGFiID0gJ211bHRpcGx5aW5nIGZhY3RvcicsIHlsYWIgPSAnJykKCmFibGluZSh2ID0gMCwgbHR5ID0gJ2Rhc2hlZCcsIGNvbCA9ICdncmV5JykKYWJsaW5lKHYgPSAxLCBsdHkgPSAnZGFzaGVkJywgY29sID0gJ3RvbWF0bzInKQoKc2VnbWVudHMoeDAgPSBsaHNfbWluLCB5MCA9IDE6ZCwgeDEgPSBsaHNfbWF4LCB5MSA9IDE6ZCApCnBvaW50cyhsaHNfbWluLCAxOmQsIHBjaCA9IDIwKQpwb2ludHMobGhzX21heCwgMTpkLCBwY2ggPSAyMCkKYXhpcygyLCBhdCA9IDE6ZCwgbGFiZWxzID0gY29sbmFtZXMobGhzKSkKYXhpcygxKQojZGV2Lm9mZigpCgpgYGAKCiMjIFdhdmUwMC9XYXZlMDEgIEVuc2VtYmxlIGJlaGF2aW91ciBpbiBrZXkgKGNvbnN0cmFpbmluZykgb3V0cHV0cy4gCgpHbG9iYWwgbWVhbiBmb3IgdGhlIDIwIHllYXJzIGF0IHRoZSBlbmQgb2YgdGhlIDIwdGggQ2VudHVyeS4gVGhlcmUgaXMgc3RpbGwgYSBzaWduaWZpY2FudCBsb3cgYmlhcyBvbiBjVmVnIG91dHB1dC4KCmBgYHtyLCBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0ID0gOH0Kd2F2ZTAwY29sIDwtICdza3libHVlMicKd2F2ZTAxY29sIDwtICd0b21hdG8yJwoKd2F2ZTAwY29sIDwtICdkb2RnZXJibHVlMicKd2F2ZTAxY29sIDwtICdmaXJlYnJpY2snCnJhbmdlY29sIDwtICdncmV5JwpgYGAKCgpgYGB7ciwgZmlnLndpZHRoID0gOCwgZmlnLmhlaWdodCA9IDggfQojIEhpc3RvZ3JhbSBvZiBsZXZlbCAxIGNvbnN0cmFpbnRzCmhjb2wgPSAnZGFya2dyZXknCmxjb2wgPSAnYmxhY2snCgojcGRmKGZpbGUgPSAnZmlncy9maWcwNS5wZGYnLCB3aWR0aCA9IDgsIGhlaWdodCA9IDgpCiNwZGYoZmlsZSA9ICdmaWdzL2xldmVsXzJfY29uc3RyYWludHNfaGlzdHMucGRmJywgd2lkdGggPSA4LCBoZWlnaHQgPSA4KQpwYXIobWZyb3cgPSBjKDIsMiksIGZnID0gJ2RhcmtncmV5JywgbGFzID0gMSwgb21hID0gYygwLjEsIDAuMSwgNCwgMC4xKSkKCnRydW5jIDwtIGZ1bmN0aW9uKHgsIHZlYyl7CiAgCiAgZGF0IDwtIHhbeCA8IG1heCh2ZWMpICYgeCA+IG1pbih2ZWMpICBdCiAgCiAgZGF0CiAgCn0KCgpoIDwtIGhpc3QoWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ25icF9sbmRfc3VtJ10sIG1haW4gPSAnTkJQJywgeGxhYiA9ICdHdEMveWVhcicsIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDBjb2wsMTUwKSkKaGlzdCh0cnVuYyhZX2NvbnN0X3dhdmUwMV9zY2FsZWQgWywnbmJwX2xuZF9zdW0nXSwgaCRicmVha3MpICwKICAgICBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAxY29sLDE1MCkgLCBicmVha3MgPSBoJGJyZWFrcywgYWRkID0gVFJVRSkKCnJ1ZyhZX2NvbnN0X3N0YW5fc2NhbGVkWyduYnBfbG5kX3N1bSddLCBsd2QgPSAyKQoKcG9seWdvbih4ID0gYygwLCAxMDAsIDEwMCwgMCksIHkgPSBjKDAsIDAsIDEwMDAsIDEwMDApLAogICAgICAgIGNvbCA9IG1ha2VUcmFuc3BhcmVudChyYW5nZWNvbCwgNjApLAogICAgICAgIGJvcmRlciA9IG1ha2VUcmFuc3BhcmVudChyYW5nZWNvbCkpCgpoIDwtIGhpc3QoWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ25wcF9ubGltX2xuZF9zdW0nXSxjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAwY29sLDE1MCksIG1haW4gPSAnTlBQJywgeGxhYiA9ICdHdEMveWVhcicpCmhpc3QodHJ1bmMoWV9jb25zdF93YXZlMDFfc2NhbGVkIFssJ25wcF9ubGltX2xuZF9zdW0nXSwgaCRicmVha3MpICwgCiAgICAgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMWNvbCkgLCBicmVha3MgPSBoJGJyZWFrcywgYWRkID0gVFJVRSkKCnJ1ZyhZX2NvbnN0X3N0YW5fc2NhbGVkWyducHBfbmxpbV9sbmRfc3VtJ10sIGx3ZCA9IDIpCgpwb2x5Z29uKHggPSBjKDM1LCA4MCwgODAsIDM1KSwgeSA9IGMoMCwgMCwgMTAwMCwgMTAwMCksCiAgICAgICAgY29sID0gbWFrZVRyYW5zcGFyZW50KHJhbmdlY29sLCA2MCksCiAgICAgICAgYm9yZGVyID0gbWFrZVRyYW5zcGFyZW50KHJhbmdlY29sKSkKCgpoIDwtIGhpc3QoWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ2NTb2lsX2xuZF9zdW0nXSwgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMGNvbCwxNTApLCBtYWluID0gJ1NvaWwgQ2FyYm9uJywgeGxhYiA9ICdHdEMnKQpoaXN0KHRydW5jKFlfY29uc3Rfd2F2ZTAxX3NjYWxlZCBbLCdjU29pbF9sbmRfc3VtJ10sIGgkYnJlYWtzKSAsIAogICAgIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDFjb2wsMTUwKSAsIGJyZWFrcyA9IGgkYnJlYWtzLCBhZGQgPSBUUlVFKQoKcnVnKFlfY29uc3Rfc3Rhbl9zY2FsZWRbJ2NTb2lsX2xuZF9zdW0nXSwgbHdkID0gMikKCnBvbHlnb24oeCA9IGMoNzUwLCAzMDAwLCAzMDAwLCA3NTApLCB5ID0gYygwLCAwLCAxMDAwLCAxMDAwKSwKICAgICAgICBjb2wgPSBtYWtlVHJhbnNwYXJlbnQocmFuZ2Vjb2wsIDYwKSwKICAgICAgICBib3JkZXIgPSBtYWtlVHJhbnNwYXJlbnQocmFuZ2Vjb2wpKQoKaCA8LSBoaXN0KFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCdjVmVnX2xuZF9zdW0nXSwgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMGNvbCwxNTApLCBtYWluID0gJ1ZlZ2V0YXRpb24gQ2FyYm9uJywgeGxhYiA9ICdHdEMnKQpoaXN0KHRydW5jKFlfY29uc3Rfd2F2ZTAxX3NjYWxlZCBbLCdjVmVnX2xuZF9zdW0nXSwgaCRicmVha3MpICwgCiAgIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDFjb2wsMTUwKSAgLCBicmVha3MgPSBoJGJyZWFrcywgYWRkID0gVFJVRSkKCnJ1ZyhZX2NvbnN0X3N0YW5fc2NhbGVkWydjVmVnX2xuZF9zdW0nXSwgbHdkID0gMikKCnBvbHlnb24oeCA9IGMoMzAwLCA4MDAsIDgwMCwgMzAwKSwgeSA9IGMoMCwgMCwgMTAwMCwgMTAwMCksCiAgICAgICAgY29sID0gbWFrZVRyYW5zcGFyZW50KHJhbmdlY29sLCA2MCksCiAgICAgICBib3JkZXIgPSAgbWFrZVRyYW5zcGFyZW50KHJhbmdlY29sKSkKCgoKcmVzZXQoKQoKbGVnZW5kKCd0b3AnLCBob3JpeiA9IFRSVUUsIGZpbGwgPSBjKG1ha2VUcmFuc3BhcmVudCh3YXZlMDBjb2wsIDE1MCksIG1ha2VUcmFuc3BhcmVudCh3YXZlMDFjb2wsIDE1MCksIG1ha2VUcmFuc3BhcmVudChyYW5nZWNvbCwgNjApKSwgbGVnZW5kID0gYygnV2F2ZTAwJywgJ1dhdmUwMScsICdBVyByYW5nZScpKQoKI2Rldi5vZmYoKQpgYGAKCiMjIFdoYXQgcHJvcG9ydGlvbiBvZiB3YXZlMDEgZmFsbCB3aXRoaW4gQW5keSBXaWx0c2hpcmUncyBjb25zdHJhaW50cz8KCkp1c3QgdW5kZXIgYSB0aGlyZC4gUG9pbnRzIGF0IGEgc2lnbmlmaWNhbnQgbW9kZWwgZGlzY3JlcGVuY3kgaW4gY1ZlZwoKT2YgdGhlIDQwMCBtZW1iZXJzIG9mIHRoZSB3YXZlMDEgZW5zZW1ibGUsIDEyOCBwYXNzIEFuZHkgV2lsdHNoaXJlJ3MgTGV2ZWwgMiBjb25zdHJhaW50cy4KCmBgYHtyfQoKbGVuZ3RoKGxldmVsMl9peF93YXZlMDEpCmxlbmd0aChsZXZlbDJfaXhfd2F2ZTAxKSAvIG50cmFpbl93YXZlMDEKCgpgYGAKCgoKYGBge3IgcGxvdC1jYXJib24tY3ljbGUtdGltZXNlcmllcy1wcmltYXJ5LCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDEyfQoKbGNvbF93YXZlMCA8LSBtYWtlVHJhbnNwYXJlbnQoJ2RvZGdlcmJsdWUyJywgIDEyMCkKbGNvbF93YXZlMDEgPC0gbWFrZVRyYW5zcGFyZW50KCdmaXJlYnJpY2snLCAgMTIwKQpsY29sX3dhdmUwMV9sZXZlbDIgPC0gJ2dvbGQnCnN0YW5jb2wgPSAnYmxhY2snCgpsaW5lUGxvdE11bHRpRW5zIDwtIGZ1bmN0aW9uKHllYXJzLCBlbnMxLCBlbnMyLCBlbnMzLCBjb2wxLCBjb2wyLCBjb2wzLCB5bGFiLCBtYWluLCB5bGltID0gTlVMTCwgLi4uKXsKICAjIFBsb3Qgd2F2ZTAwIGFuZCB3YXZlMDEgdGltZXNlcmllcyBvbiB0b3Agb2Ygb25lIGFub3RoZXIKICAKICBudCA8LSBsZW5ndGgoeWVhcnMpIAogIGlmKGlzLm51bGwoeWxpbSkpewogICAgCiAgeWxpbSA9IHJhbmdlKGMoZW5zMVssMV0sIGVuczFbLG50XSwgZW5zMlssMV0sIGVuczJbICxudF0sIGVuczNbLDFdLCBlbnMzWywgbnRdKSkKICB9CiAgCiAgZWxzZSB5bGltIDwtIHlsaW0KICAKICBtYXRwbG90KHllYXJzLCB0KGVuczEpLCB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLHlsaW0gPSB5bGltLCBjb2wgPSBjb2wxLAogICAgICAgIHlsYWIgPSB5bGFiLCBtYWluID0gbWFpbiwgeGxhYiA9ICcnLAogICAgICAgIGJ0eSA9ICduJywgLi4uKQogIG1hdGxpbmVzKHllYXJzLCB0KGVuczIpLCBjb2wgPSBjb2wyLCBsdHkgPSAnc29saWQnKQogICAgbWF0bGluZXMoeWVhcnMsIHQoZW5zMyksIGNvbCA9IGNvbDMsIGx0eSA9ICdzb2xpZCcpCn0KCnBkZihmaWxlID0gJ2ZpZ3MvZmlnMDMucGRmJywgd2lkdGggPSAxMCwgaGVpZ2h0ID0gMTIpCiNwZGYoZmlsZSA9ICdmaWdzL2NhcmJvbi1jeWNsZS10aW1lc2VyaWVzLXdhdmVzLWNvbnN0cmFpbmVkLnBkZicsIHdpZHRoID0gMTAsIGhlaWdodCA9IDEyKQpwYXIobWZyb3c9IGMoMyw1KSwgbGFzID0gMSwgbWFyID0gYyg0LDQsMSwwKSkKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IG5wcF9lbnNfd2F2ZTAwW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IG5wcF9lbnNfd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IG5wcF9lbnNfd2F2ZTAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ05QUCcpCgpsaW5lcyh5ZWFycyxucHBfc3RhbiwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9ICBuYnBfZW5zX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLCAKICAgICAgICAgICAgICAgICBlbnMyID0gbmJwX2Vuc193YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gbmJwX2Vuc193YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSxjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdOQlAnLCB5bGltID0gYygtMTAsMTApKQoKbGluZXMoeWVhcnMsIG5icF9zdGFuLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gY1NvaWxfZW5zX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBjU29pbF9lbnNfd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IGNTb2lsX2Vuc193YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnY1NvaWwnLCB5bGltID0gcmFuZ2UoYyhjU29pbF9lbnNfd2F2ZTAwWywxXSwgY1NvaWxfZW5zX3dhdmUwMFssMTY0XSkpKQoKbGluZXMoeWVhcnMsIGNTb2lsX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSBjVmVnX2Vuc193YXZlMDBbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gY1ZlZ19lbnNfd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IGNWZWdfZW5zX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdjVmVnJykKCmxpbmVzKHllYXJzLCBjVmVnX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSBsYWlfbG5kX21lYW5fZW5zX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBsYWlfbG5kX21lYW5fZW5zX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBsYWlfbG5kX21lYW5fZW5zX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdMYWknKQoKbGluZXMoeWVhcnMsIGxhaV9sbmRfbWVhbl9zdGFuLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gcmhfbG5kX3N1bV9lbnNfd2F2ZTAwW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IHJoX2xuZF9zdW1fZW5zX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSByaF9sbmRfc3VtX2Vuc193YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ1JIJykKCmxpbmVzKHllYXJzLCByaF9sbmRfc3VtX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSBmTHVjX2xuZF9zdW1fZW5zX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBmTHVjX2xuZF9zdW1fZW5zX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBmTHVjX2xuZF9zdW1fZW5zX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdmTHVjJykKCmxpbmVzKHllYXJzLCBmTHVjX2xuZF9zdW1fc3RhbiwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IGZIYXJ2ZXN0X2xuZF9zdW1fZW5zX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBmSGFydmVzdF9sbmRfc3VtX2Vuc193YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gZkhhcnZlc3RfbG5kX3N1bV9lbnNfd2F2ZTAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ2ZIYXJ2ZXN0JykKCmxpbmVzKHllYXJzLCBmSGFydmVzdF9sbmRfc3VtX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSB0cmVlRnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAwW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IHRyZWVGcmFjX2xuZF9tZWFuX2Vuc193YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gdHJlZUZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnJScsIG1haW4gPSAndHJlZWZyYWMnCiAgICAgICAgICAgICAgICAgKQoKbGluZXMoeWVhcnMsIHRyZWVGcmFjX2xuZF9tZWFuX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSBzaHJ1YkZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBzaHJ1YkZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBzaHJ1YkZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnJScsIG1haW4gPSAnc2hydWJmcmFjJwopCgpsaW5lcyh5ZWFycywgc2hydWJGcmFjX2xuZF9tZWFuX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSBiYXJlc29pbEZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBiYXJlc29pbEZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBiYXJlc29pbEZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnJScsIG1haW4gPSAnYmFyZXNvaWxmcmFjJykKCmxpbmVzKHllYXJzLCBiYXJlc29pbEZyYWNfbG5kX21lYW5fc3RhbiwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGMzUGZ0RnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAwW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IGMzUGZ0RnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IGMzUGZ0RnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICclJywgbWFpbiA9ICdjM1BmdEZyYWMnKQoKbGluZXMoeWVhcnMsIGMzUGZ0RnJhY19sbmRfbWVhbl9zdGFuLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgYzRQZnRGcmFjX2xuZF9tZWFuX2Vuc193YXZlMDBbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gYzRQZnRGcmFjX2xuZF9tZWFuX2Vuc193YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gYzRQZnRGcmFjX2xuZF9tZWFuX2Vuc193YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJyUnLCBtYWluID0gJ2M0UGZ0RnJhYycpCgpsaW5lcyh5ZWFycywgYzRQZnRGcmFjX2xuZF9tZWFuX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgoKcmVzZXQoKQoKbGVnZW5kKCdib3R0b21yaWdodCcsIGxlZ2VuZCA9IGMoJ3dhdmUwMCcsJ3dhdmUwMScsJ3dhdmUwMSBsZXZlbDInLCdzdGFuZGFyZCcpLCBsdHkgPSAnc29saWQnLCBsd2QgPSAxLjUsIGNvbCA9IGMobGNvbF93YXZlMCwgbGNvbF93YXZlMDEsIGxjb2xfd2F2ZTAxX2xldmVsMiwgc3RhbmNvbCksIGluc2V0ID0gYygwLjA1LCAwLjE1KSApCgpkZXYub2ZmKCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSAxMn0KCnBkZihmaWxlID0gJ2ZpZ3MvZmlnMDQucGRmJywgd2lkdGggPSAxMCwgaGVpZ2h0ID0gMTIpCiNwZGYoZmlsZSA9ICdmaWdzL2NhcmJvbi1jeWNsZS10aW1lc2VyaWVzLWFub21hbHktd2F2ZXMtY29uc3RyYWluZWQucGRmJywgd2lkdGggPSAxMCwgaGVpZ2h0ID0gMTIpCnBhcihtZnJvdz0gYygzLDUpLCBsYXMgPSAxLCBtYXIgPSBjKDQsNCwxLDApKQoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gbnBwX2Vuc19hbm9tX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBucHBfZW5zX2Fub21fd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IG5wcF9lbnNfYW5vbV93YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnTlBQJykKCmxpbmVzKHllYXJzLG5wcF9zdGFuX2Fub20sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9ICBuYnBfZW5zX2Fub21fd2F2ZTAwW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sIAogICAgICAgICAgICAgICAgIGVuczIgPSBuYnBfZW5zX2Fub21fd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IG5icF9lbnNfYW5vbV93YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSxjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdOQlAnLCB5bGltID0gYygtMTAsMTApKQoKbGluZXMoeWVhcnMsIG5icF9zdGFuX2Fub20sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSBjU29pbF9lbnNfYW5vbV93YXZlMDBbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gY1NvaWxfZW5zX2Fub21fd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IGNTb2lsX2Vuc19hbm9tX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdjU29pbCcsIHlsaW0gPSByYW5nZShjKGNTb2lsX2Vuc19hbm9tX3dhdmUwMFssMV0sIGNTb2lsX2Vuc19hbm9tX3dhdmUwMFssMTY0XSkpKQoKbGluZXMoeWVhcnMsIGNTb2lsX3N0YW5fYW5vbSwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IGNWZWdfZW5zX2Fub21fd2F2ZTAwW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IGNWZWdfZW5zX2Fub21fd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IGNWZWdfZW5zX2Fub21fd2F2ZTAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ2NWZWcnKQoKbGluZXMoeWVhcnMsIGNWZWdfc3Rhbl9hbm9tLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gbGFpX2xuZF9tZWFuX2Vuc19hbm9tX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBsYWlfbG5kX21lYW5fZW5zX2Fub21fd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IGxhaV9sbmRfbWVhbl9lbnNfYW5vbV93YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnTGFpJykKCmxpbmVzKHllYXJzLCBsYWlfbG5kX21lYW5fc3Rhbl9hbm9tLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gcmhfbG5kX3N1bV9lbnNfYW5vbV93YXZlMDBbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gcmhfbG5kX3N1bV9lbnNfYW5vbV93YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gcmhfbG5kX3N1bV9lbnNfYW5vbV93YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ1JIJykKCmxpbmVzKHllYXJzLCByaF9sbmRfc3VtX3N0YW5fYW5vbSwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IGZMdWNfbG5kX3N1bV9lbnNfYW5vbV93YXZlMDBbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gZkx1Y19sbmRfc3VtX2Vuc19hbm9tX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBmTHVjX2xuZF9zdW1fZW5zX2Fub21fd2F2ZTAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ2ZMdWMnKQoKbGluZXMoeWVhcnMsIGZMdWNfbG5kX3N1bV9zdGFuX2Fub20sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCiAKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gZkhhcnZlc3RfbG5kX3N1bV9lbnNfYW5vbV93YXZlMDBbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gZkhhcnZlc3RfbG5kX3N1bV9lbnNfYW5vbV93YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gZkhhcnZlc3RfbG5kX3N1bV9lbnNfYW5vbV93YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnZkhhcnZlc3QnKQoKbGluZXMoeWVhcnMsIGZIYXJ2ZXN0X2xuZF9zdW1fc3Rhbl9hbm9tLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gdHJlZUZyYWNfbG5kX21lYW5fZW5zX2Fub21fd2F2ZTAwW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IHRyZWVGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSB0cmVlRnJhY19sbmRfbWVhbl9lbnNfYW5vbV93YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJyUnLCBtYWluID0gJ3RyZWVmcmFjJwogICAgICAgICAgICAgICAgICkKCmxpbmVzKHllYXJzLCB0cmVlRnJhY19sbmRfbWVhbl9zdGFuX2Fub20sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSBzaHJ1YkZyYWNfbG5kX21lYW5fZW5zX2Fub21fd2F2ZTAwW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IHNocnViRnJhY19sbmRfbWVhbl9lbnNfYW5vbV93YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gc2hydWJGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnJScsIG1haW4gPSAnc2hydWJmcmFjJwopCgpsaW5lcyh5ZWFycywgc2hydWJGcmFjX2xuZF9tZWFuX3N0YW5fYW5vbSwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IGJhcmVzb2lsRnJhY19sbmRfbWVhbl9lbnNfYW5vbV93YXZlMDBbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gYmFyZXNvaWxGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBiYXJlc29pbEZyYWNfbG5kX21lYW5fZW5zX2Fub21fd2F2ZTAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICclJywgbWFpbiA9ICdiYXJlc29pbGZyYWMnKQoKbGluZXMoeWVhcnMsIGJhcmVzb2lsRnJhY19sbmRfbWVhbl9zdGFuX2Fub20sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBjM1BmdEZyYWNfbG5kX21lYW5fZW5zX2Fub21fd2F2ZTAwW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IGMzUGZ0RnJhY19sbmRfbWVhbl9lbnNfYW5vbV93YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gYzNQZnRGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnJScsIG1haW4gPSAnYzNQZnRGcmFjJykKCmxpbmVzKHllYXJzLCBjM1BmdEZyYWNfbG5kX21lYW5fc3Rhbl9hbm9tLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgYzRQZnRGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBjNFBmdEZyYWNfbG5kX21lYW5fZW5zX2Fub21fd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IGM0UGZ0RnJhY19sbmRfbWVhbl9lbnNfYW5vbV93YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJyUnLCBtYWluID0gJ2M0UGZ0RnJhYycpCgpsaW5lcyh5ZWFycywgYzRQZnRGcmFjX2xuZF9tZWFuX3N0YW5fYW5vbSwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCnJlc2V0KCkKCmxlZ2VuZCgnYm90dG9tcmlnaHQnLCBsZWdlbmQgPSBjKCd3YXZlMDAnLCd3YXZlMDEnLCd3YXZlMDEgbGV2ZWwyJywnc3RhbmRhcmQnKSwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMS41LCBjb2wgPSBjKGxjb2xfd2F2ZTAsIGxjb2xfd2F2ZTAxLCBsY29sX3dhdmUwMV9sZXZlbDIsIHN0YW5jb2wpLCBpbnNldCA9IGMoMC4wNSwgMC4xNSkgKQoKCmRldi5vZmYoKQoKYGBgIAoKIyMgRXhwbG9yaW5nIHN1bW1hcnkgb2YgY29uc3RyYWludDogQ3VtdWxhdGl2ZSBOQlAKCgojIyMgQ2FyYm9uIGJ1ZGdldCBkYXRhCgpbU2VjdGlvbiAyLjUgaW4gRnJpZWRsaW5nc3RlaW4gZXQgYWwuXShodHRwczovL2Vzc2QuY29wZXJuaWN1cy5vcmcvYXJ0aWNsZXMvMTIvMzI2OS8yMDIwLyNzZWN0aW9uMikgZGVzY3JpYmVzIGhvdyB0aGUgbGFuZCBjYXJib24gc2luayBpcyBlc3RpbWF0ZWQuCmBgYHtyLCBoaXN0b3JpY2FsLWNhcmJvbi1idWRnZXQsIHdhcm5pbmcgPSBGQUxTRSwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSAxMH0KCiNwZGYoZmlsZSA9ICdjYXJib25fYnVkZ2V0LnBkZicsIHdpZHRoID0gMTAsIGhlaWdodCA9IDgpCiMgUXVlc3Rpb246IEhvdyBjbG9zZWx5IHNob3VsZCBvdXIgbW9kZWwgbWF0Y2ggdGhpcyBjdXJ2ZT8gV2hpY2ggb3V0cHV0PwojIChNeSBndWVzcyBpcyAnVG90YWwgTGFuZCBDYXJib24gYW5vbWFseScpCmhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCA8LSByZWFkX2V4Y2VsKCdkYXRhL0dsb2JhbF9DYXJib25fQnVkZ2V0XzIwMjB2MS4wLnhsc3gnLCBzaGVldCA9ICJIaXN0b3JpY2FsIEJ1ZGdldCIsIHNraXAgPSAxNSwgbl9tYXggPSAyNzApCgpwYXIobWZyb3cgPSBjKDMsMikpCnlsaW0gPSBjKC0xLCA2KQoKCmxhbmRfc2lua19uZXQgPC0gaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBsYW5kIHNpbmtgIC0gaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBsYW5kLXVzZSBjaGFuZ2UgZW1pc3Npb25zYAoKcGxvdChoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhciwgaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBmb3NzaWwgZW1pc3Npb25zIGV4Y2x1ZGluZyBjYXJib25hdGlvbmAsIG1haW4gPSAnZm9zc2lsIGVtaXNzaW9ucyBleGNsdWRpbmcgY2FyYm9uYXRpb24nLCB5bGFiID0gJycsCiAgICAgdHlwZSA9ICdsJywgYnR5ID0gJ24nLCB5bGltID0geWxpbSkKCnBsb3QoaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JFllYXIsIGhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCRgbGFuZCBzaW5rYCwgbWFpbiA9ICdsYW5kIHNpbmsnLCB5bGFiID0gJycsIHR5cGUgPSAnbCcsIGJ0eSA9ICduJywgeWxpbSA9IHlsaW0pCgpsaW5lcyhoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhciwgbGFuZF9zaW5rX25ldCwgY29sID0gJ3JlZCcpCgpsZWdlbmQoJ3RvcGxlZnQnLCBsZWdlbmQgPSAnbGFuZCBzaW5rIC0gbGFuZCB1c2UgY2hhbmdlIGVtaXNzaW9ucycsIGNvbCA9ICdyZWQnLCBsdHkgPSAnc29saWQnKQoKcGxvdChoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhciwgaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBsYW5kLXVzZSBjaGFuZ2UgZW1pc3Npb25zYCwgbWFpbiA9ICdsYW5kIHVzZSBjaGFuZ2UgZW1pc3Npb25zJywKICAgICB5bGFiID0gJycsIHR5cGUgPSAnbCcsIGJ0eSA9ICduJywgeWxpbSA9IHlsaW0pCgpwbG90KGhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCRZZWFyLCBoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkYGF0bW9zcGhlcmljIGdyb3d0aGAsIG1haW4gPSAnYXRtb3NwaGVyaWMgZ3Jvd3RoJywgeWxhYiA9ICcnLAogICAgIHR5cGUgPSAnbCcsIGJ0eSA9ICduJywgeWxpbSA9IHlsaW0pCgoKcGxvdChoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhciwgaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBvY2VhbiBzaW5rYCwgbWFpbiA9ICdvY2VhbiBzaW5rJywgdHlwZSA9ICdsJywgYnR5ID0gJ24nLCB5bGltID0geWxpbSkKCnBsb3QoaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JFllYXIsIGhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCRgYnVkZ2V0IGltYmFsYW5jZWAsIG1haW4gPSAnYnVkZ2V0IGltYmFsYW5jZScsIHlsYWIgPSAnJywgdHlwZSA9ICdsJywgYnR5ID0gJ24nLCB5bGltID0geWxpbSkKCiNkZXYub2ZmKCkKYGBgCklQQ0MgQVI2IENoYXB0ZXIgNSBzdGF0ZXM6ICJUaGUgbmV0IGxhbmQgY2FyYm9uIHNpbmsgaXMgdGFrZW4gYXMgbmV0IGJpb21lIHByb2R1Y3Rpdml0eSAoTkJQKSBhbmQgc28gaW5jbHVkZXMgYW55IG1vZGVsbGVkIG5ldCBsYW5kLXVzZSAKY2hhbmdlIGVtaXNzaW9ucy4gRnVydGhlciBkZXRhaWxzIG9uIGRhdGEgc291cmNlcyBhbmQgcHJvY2Vzc2luZyBhcmUgYXZhaWxhYmxlIGluIHRoZSBjaGFwdGVyIGRhdGEgdGFibGUgKFRhYmxlIDUuU00uNikuIgoKVGhlIEdDUCBzYXlzOiAKIlRoZSBsYW5kIHNpbmsgaXMgdGhlIGF2ZXJhZ2Ugb2Ygc2V2ZXJhbCBkeW5hbWljIGdsb2JhbCB2ZWdldGF0aW9uIG1vZGVscyB0aGF0IHJlcHJvZHVjZSB0aGUgb2JzZXJ2ZWQgbWVhbiB0b3RhbCBsYW5kIHNpbmsgb2YgdGhlIDE5OTBzLiIKCkFSNiBDaGFwdGVyIDUgc3RhdGVzOiAgIlRoZSBsYW5kIGNhcmJvbiBjeWNsZSBjb21wb25lbnRzIG9mIGhpc3RvcmljYWwgRVNNIHNpbXVsYXRpb25zIHNob3cgYSBsYXJnZXIgcmFuZ2UsIHdpdGggc2ltdWxhdGVkIGN1bXVsYXRpdmUgbGFuZCBjYXJib24gdXB0YWtlICgxODUw4oCTMjAxNCkgc3Bhbm5pbmcgdGhlIHJhbmdlIGZyb20g4oCTNDcgdG8gKzIxIEd0QywgY29tcGFyZWQgdG8gdGhlIEdDUCBlc3RpbWF0ZSBvZiDigJMxMiDCsSA1MCBHdEMgKEZpZ3VyZSA1LjIzYikuCmBgYHtyLCBmaWcud2lkdGg9NywgZmlnLmhlaWdodCA9IDd9CgoKcGxvdChoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhciwgaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBsYW5kIHNpbmtgLAogICAgIG1haW4gPSAnbGFuZCBzaW5rJywgeWxhYiA9ICcnLCB0eXBlID0gJ2wnLCBidHkgPSAnbicsIHlsaW0gPSB5bGltKQoKCnBsb3QoaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JFllYXIsIGN1bXN1bShoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkYGxhbmQgc2lua2ApLAogICAgIG1haW4gPSAnbGFuZCBzaW5rJywgeWxhYiA9ICcnLCB0eXBlID0gJ2wnLCBidHkgPSAnbicpCgoKI3Bsb3QoaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JFllYXIsIGN1bXN1bShsYW5kX3NpbmtfbmV0LCBuYS5ybSA9IFRSVUUpLAojICAgICBtYWluID0gJ2xhbmQgc2luaycsIHlsYWIgPSAnJywgdHlwZSA9ICdsJywgYnR5ID0gJ24nKQoKbWF0Y2hfeWVhcnNfaXggPC0gd2hpY2goaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JFllYXIgJWluJSAxODUwOjIwMTMpCgptYXRjaF95ZWFycyA8LSBoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhclttYXRjaF95ZWFyc19peF0KY3VtdWxhdGl2ZV9uZXRfbGFuZF9zaW5rIDwtIGN1bXN1bShsYW5kX3NpbmtfbmV0W21hdGNoX3llYXJzX2l4XSkKCgpwYXIobGFzID0gMSkKcGxvdChtYXRjaF95ZWFycywgY3VtdWxhdGl2ZV9uZXRfbGFuZF9zaW5rLAogICAgIHR5cGUgPSAnbCcsIG1haW4gPSAiQ3VtdWxhdGl2ZSBOZXQgTGFuZCBTaW5rIiwgeGxhYiA9ICIiLCB5bGFiID0gIkd0QyIsCiAgICAgeWxpbSA9IGMoLTgwLCAyMCkpCmBgYAoKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuaGVpZ2h0ID0gOH0KCnBhcihtYXIgPSBjKDgsNCw0LDEpLCBsYXMgPSAxKQpjbmJwX2Vuc193YXZlMDAgPC0gdChhcHBseShuYnBfZW5zX3dhdmUwMCwgMSwgRlVOID0gY3Vtc3VtKSkKY25icF9lbnNfd2F2ZTAxIDwtIHQoYXBwbHkobmJwX2Vuc193YXZlMDEsIDEsIEZVTiA9IGN1bXN1bSkpCmNuYnBfc3RhbiA8LSBjdW1zdW0obmJwX3N0YW4pCgoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gIGNuYnBfZW5zX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLCAKICAgICAgICAgICAgICAgICBlbnMyID0gY25icF9lbnNfd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IGNuYnBfZW5zX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICdDdW11bGF0aXZlIE5CUCAoR3RDKScsIG1haW4gPSAnQ3VtdWxhdGl2ZSBOQlAnLCB4bGltID0gYygxODUwLCAyMDM1KSkKCmxpbmVzKHllYXJzLCBjbmJwX3N0YW4sIGNvbCA9ICdibGFjaycsIGx3ZCA9IDIpCgpsaW5lcyhtYXRjaF95ZWFycywgY3VtdWxhdGl2ZV9uZXRfbGFuZF9zaW5rLCBsdHkgPSAnZGFzaGVkJywgY29sID0gJ2JsYWNrJykKCmFycm93cygyMDIyLC00NywgMjAyMiwyMSwgYW5nbGUgPSA5MCwgbGVuZ3RoID0gMC4wNSwgY29kZSA9IDMpCgphcnJvd3MoMjAzNSwoLTEyLTUwKSwgMjAzNSwoLTEyKzUwKSwgIGFuZ2xlID0gOTAsIGxlbmd0aCA9IDAuMDUsIGNvZGUgPSAzKQoKdGV4dCgyMDIyLCAzMCwgJ0FSNicsIGNleCA9IDAuOCkKCnRleHQoMjAzNSwgNDcsICdHQ1AnLCBjZXggPSAwLjgpCnJlc2V0KCkKCgpsZWdlbmQoJ2JvdHRvbScsIGxlZ2VuZCA9IGMoJ3dhdmUwMCcsJ3dhdmUwMScsJ3dhdmUwMSBsZXZlbDInLCdzdGFuZGFyZCcsICdHQ1AgZXN0aW1hdGUnKSwgbHR5ID0gYygnc29saWQnLCAnc29saWQnLCAnc29saWQnLCAnc29saWQnLCAnZGFzaGVkJyksIGx3ZCA9IDEuNSwgY29sID0gYyhsY29sX3dhdmUwLCBsY29sX3dhdmUwMSwgbGNvbF93YXZlMDFfbGV2ZWwyLCBzdGFuY29sLCBzdGFuY29sKSwgaG9yaXogPSBGQUxTRSwgaW5zZXQgPSAwLjAxLCBjZXggPSAwLjgpCgoKYGBgCgoKCgojIEhvdyBtdWNoIGFyZSBhbGwgc2VsZWN0IG91dHB1dCBjb25zdHJhaW5lZD8KYGBge3J9CgpzZWxlY3RlZF90YWdzIDwtIGMoJ25wcCcsICduYnAnLCAnY1NvaWwnLCAnY1ZlZycsICdsYWlfbG5kX21lYW4nLCAncmhfbG5kX3N1bScsICdmTHVjX2xuZF9zdW0nLCAnZkhhcnZlc3RfbG5kX3N1bScsICd0cmVlRnJhY19sbmRfbWVhbicsICdzaHJ1YkZyYWNfbG5kX21lYW4nLCAnYmFyZXNvaWxGcmFjX2xuZF9tZWFuJywgJ2MzUGZ0RnJhY19sbmRfbWVhbicsICdjNFBmdEZyYWNfbG5kX21lYW4nKQoKIyB3YXZlMDAKc2VsZWN0ZWRfdGFnc192ZWNfd2F2ZTAwIDwtIHBhc3RlMChzZWxlY3RlZF90YWdzLCAnX2Vuc193YXZlMDAnKQoKbXZfbWVhbnNfd2F2ZTAwIDwtIG1hdHJpeChuY29sID0gbGVuZ3RoKHNlbGVjdGVkX3RhZ3MpLCBucm93ID0gbnJvdyhucHBfZW5zX3dhdmUwMCkpCmNvbG5hbWVzKG12X21lYW5zX3dhdmUwMCkgPC0gc2VsZWN0ZWRfdGFncwoKZm9yKGkgaW4gMTpsZW5ndGgoc2VsZWN0ZWRfdGFnc192ZWNfd2F2ZTAwKSl7CiAgCiAgZGF0IDwtIGdldChzZWxlY3RlZF90YWdzX3ZlY193YXZlMDBbaV0pCiAgCiAgY29saXggPC0gMTpuY29sKGRhdCkKICB0cnVuY19kYXQgPC0gZGF0WywgdGFpbChjb2xpeCwyMCldCiAgCiAgbWVhbl9kYXQgPC0gYXBwbHkodHJ1bmNfZGF0LCAxLCBtZWFuLCBuYS5ybSA9IFRSVUUpCiAgbXZfbWVhbnNfd2F2ZTAwWyxpIF0gPC0gbWVhbl9kYXQKICAKfQoKIyMgd2F2ZTAxCnNlbGVjdGVkX3RhZ3NfdmVjX3dhdmUwMSA8LSBwYXN0ZTAoc2VsZWN0ZWRfdGFncywgJ19lbnNfd2F2ZTAxJykKbXZfbWVhbnNfd2F2ZTAxIDwtIG1hdHJpeChuY29sID0gbGVuZ3RoKHNlbGVjdGVkX3RhZ3MpLCBucm93ID0gbnJvdyhucHBfZW5zX3dhdmUwMSkpCmNvbG5hbWVzKG12X21lYW5zX3dhdmUwMSkgPC0gc2VsZWN0ZWRfdGFncwoKZm9yKGkgaW4gMTpsZW5ndGgoc2VsZWN0ZWRfdGFnc192ZWNfd2F2ZTAxKSl7CiAgCiAgZGF0IDwtIGdldChzZWxlY3RlZF90YWdzX3ZlY193YXZlMDFbaV0pCiAgCiAgY29saXggPC0gMTpuY29sKGRhdCkKICB0cnVuY19kYXQgPC0gZGF0WywgdGFpbChjb2xpeCwyMCldCiAgCiAgbWVhbl9kYXQgPC0gYXBwbHkodHJ1bmNfZGF0LCAxLCBtZWFuLCBuYS5ybSA9IFRSVUUpCiAgbXZfbWVhbnNfd2F2ZTAxWyxpIF0gPC0gbWVhbl9kYXQKICAKfQoKCiMgd2F2ZTAwIGFub21hbHkKc2VsZWN0ZWRfdGFnc192ZWNfYW5vbV93YXZlMDAgPC0gcGFzdGUwKHNlbGVjdGVkX3RhZ3MsICdfZW5zX2Fub21fd2F2ZTAwJykKCm12X21lYW5zX2Fub21fd2F2ZTAwIDwtIG1hdHJpeChuY29sID0gbGVuZ3RoKHNlbGVjdGVkX3RhZ3MpLCBucm93ID0gbnJvdyhucHBfZW5zX2Fub21fd2F2ZTAwKSkKY29sbmFtZXMobXZfbWVhbnNfYW5vbV93YXZlMDApIDwtIHNlbGVjdGVkX3RhZ3MKCmZvcihpIGluIDE6bGVuZ3RoKHNlbGVjdGVkX3RhZ3NfdmVjX2Fub21fd2F2ZTAwKSl7CiAgCiAgZGF0IDwtIGdldChzZWxlY3RlZF90YWdzX3ZlY19hbm9tX3dhdmUwMFtpXSkKICAKICBjb2xpeCA8LSAxOm5jb2woZGF0KQogIHRydW5jX2RhdCA8LSBkYXRbLCB0YWlsKGNvbGl4LDIwKV0KICAKICBtZWFuX2RhdCA8LSBhcHBseSh0cnVuY19kYXQsIDEsIG1lYW4sIG5hLnJtID0gVFJVRSkKICBtdl9tZWFuc19hbm9tX3dhdmUwMFssaSBdIDwtIG1lYW5fZGF0CiAgCn0KCiMgd2F2ZTAxIGFub21hbHkKc2VsZWN0ZWRfdGFnc192ZWNfYW5vbV93YXZlMDEgPC0gcGFzdGUwKHNlbGVjdGVkX3RhZ3MsICdfZW5zX2Fub21fd2F2ZTAxJykKCm12X21lYW5zX2Fub21fd2F2ZTAxIDwtIG1hdHJpeChuY29sID0gbGVuZ3RoKHNlbGVjdGVkX3RhZ3MpLCBucm93ID0gbnJvdyhucHBfZW5zX2Fub21fd2F2ZTAxKSkKY29sbmFtZXMobXZfbWVhbnNfYW5vbV93YXZlMDEpIDwtIHNlbGVjdGVkX3RhZ3MKCmZvcihpIGluIDE6bGVuZ3RoKHNlbGVjdGVkX3RhZ3NfdmVjX2Fub21fd2F2ZTAxKSl7CiAgCiAgZGF0IDwtIGdldChzZWxlY3RlZF90YWdzX3ZlY19hbm9tX3dhdmUwMVtpXSkKICAKICBjb2xpeCA8LSAxOm5jb2woZGF0KQogIHRydW5jX2RhdCA8LSBkYXRbLCB0YWlsKGNvbGl4LDIwKV0KICAKICBtZWFuX2RhdCA8LSBhcHBseSh0cnVuY19kYXQsIDEsIG1lYW4sIG5hLnJtID0gVFJVRSkKICBtdl9tZWFuc19hbm9tX3dhdmUwMVssaSBdIDwtIG1lYW5fZGF0CiAgCn0KCmBgYAoKYGBge3J9CgpyYW5nZV93YXZlMDAgPC0gYXBwbHkobXZfbWVhbnNfd2F2ZTAwW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sIDIgLCByYW5nZSkgIyBXYXZlMDAgc2V0cyB0aGUgaW5pdGlhbCByYW5nZQpyYW5nZV93YXZlMDEgPC0gYXBwbHkobXZfbWVhbnNfd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sIDIsIHJhbmdlKQpyYW5nZV93YXZlMDFfbGV2ZWwyYSA8LSBhcHBseShtdl9tZWFuc193YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sIDIsIHJhbmdlKQoKIyBXaGF0IGlzIHRoZSBvdXRwdXQgcmFuZ2Ugb2YgdGhlIGxldmVsMmEgbW9kZXJuIHZhbHVlLCBleHByZXNzZWQgYXMgYSBwcm9wb3J0aW9uIG9mIHRoZSBpbml0aWFsIGVuc2VtYmxlPwpyYW5nZV9wcm9wX3dhdmUwMV9sZXZlbDJhIDwtICAoYXBwbHkocmFuZ2Vfd2F2ZTAxX2xldmVsMmEsIDIsIGRpZmYpIC8gYXBwbHkocmFuZ2Vfd2F2ZTAwLCAyLCBkaWZmKSkgKjEwMAoKCnJhbmdlX2Fub21fd2F2ZTAwIDwtIGFwcGx5KG12X21lYW5zX2Fub21fd2F2ZTAwW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sIDIgLCByYW5nZSkgIyBXYXZlMDAgc2V0cyB0aGUgaW5pdGlhbCByYW5nZQpyYW5nZV9hbm9tX3dhdmUwMSA8LSBhcHBseShtdl9tZWFuc19hbm9tX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLCAyLCByYW5nZSkKcmFuZ2VfYW5vbV93YXZlMDFfbGV2ZWwyYSA8LSBhcHBseShtdl9tZWFuc19hbm9tX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwgMiwgcmFuZ2UpCgojIFdoYXQgaXMgdGhlIG91dHB1dCByYW5nZSBvZiB0aGUgbGV2ZWwyYSBtb2Rlcm4gdmFsdWUsIGV4cHJlc3NlZCBhcyBhIHByb3BvcnRpb24gb2YgdGhlIGluaXRpYWwgZW5zZW1ibGU/CnJhbmdlX3Byb3BfYW5vbV93YXZlMDFfbGV2ZWwyYSA8LSAgKGFwcGx5KHJhbmdlX2Fub21fd2F2ZTAxX2xldmVsMmEsIDIsIGRpZmYpIC8gYXBwbHkocmFuZ2VfYW5vbV93YXZlMDAsIDIsIGRpZmYpKSAqMTAwCgoKYGBgCgpgYGB7cn0KYWxsX3dhdmVzX212IDwtIHJiaW5kKG12X21lYW5zX3dhdmUwMFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLCBtdl9tZWFuc193YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSkKCnJhbmdlX2FsbF93YXZlcyA8LSBhcHBseShhbGxfd2F2ZXNfbXYsIDIsIHJhbmdlKQoKbGV2ZWwyX2l4X2FsbF93YXZlc19tdiA8LSB3aGljaChhbGxfd2F2ZXNfbXZbLCduYnAnXSA+IDAgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX3dhdmVzX212WywnbnBwJ10gPiAzNSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfd2F2ZXNfbXZbLCducHAnXSA8IDgwICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF93YXZlc19tdlssJ2NTb2lsJ10gPiA3NTAgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX3dhdmVzX212WywnY1NvaWwnXSA8IDMwMDAgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX3dhdmVzX212WywnY1ZlZyddID4gMzAwICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF93YXZlc19tdlssJ2NWZWcnXSA8IDgwMAopCgphbGxfd2F2ZXNfbXZfbGV2ZWwyIDwtIGFsbF93YXZlc19tdltsZXZlbDJfaXhfYWxsX3dhdmVzX212LCBdCgoKYWxsX3dhdmVzX2NvbCA8LSByZXAoenJlZCwgbnJvdyhhbGxfd2F2ZXNfbXYpKQoKYWxsX3dhdmVzX2xldmVsMl9jb2wgPC0gYWxsX3dhdmVzX2NvbAphbGxfd2F2ZXNfbGV2ZWwyX2NvbFtsZXZlbDJfaXhfYWxsX3dhdmVzX212XSA8LSB6Ymx1ZQoKcmFuZ2VfYWxsX3dhdmVzX2xldmVsMiA8LSBhcHBseShhbGxfd2F2ZXNfbXZbbGV2ZWwyX2l4X2FsbF93YXZlc19tdiwgXSwgMiwgcmFuZ2UpCgpyYW5nZV9wcm9wX2FsbF93YXZlc19sZXZlbDIgPC0oYXBwbHkocmFuZ2VfYWxsX3dhdmVzX2xldmVsMiwgMiwgZGlmZikgLyBhcHBseShyYW5nZV9hbGxfd2F2ZXMsIDIsIGRpZmYpKSAqMTAwCgojIEFub21hbHkKYWxsX3dhdmVzX2Fub21fbXYgPC0gcmJpbmQobXZfbWVhbnNfYW5vbV93YXZlMDBbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwgbXZfbWVhbnNfYW5vbV93YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSkKCnJhbmdlX2FsbF93YXZlc19hbm9tIDwtIGFwcGx5KGFsbF93YXZlc19hbm9tX212LCAyLCByYW5nZSkKCmFsbF93YXZlc19hbm9tX212X2xldmVsMiA8LSBhbGxfd2F2ZXNfYW5vbV9tdltsZXZlbDJfaXhfYWxsX3dhdmVzX212LCBdCgpyYW5nZV9hbGxfd2F2ZXNfYW5vbV9sZXZlbDIgPC0gYXBwbHkoYWxsX3dhdmVzX2Fub21fbXZbbGV2ZWwyX2l4X2FsbF93YXZlc19tdiwgXSwgMiwgcmFuZ2UpCgpyYW5nZV9wcm9wX2FsbF93YXZlc19hbm9tX2xldmVsMiA8LShhcHBseShyYW5nZV9hbGxfd2F2ZXNfYW5vbV9sZXZlbDIsIDIsIGRpZmYpIC8gYXBwbHkocmFuZ2VfYWxsX3dhdmVzX2Fub20sIDIsIGRpZmYpKSAqMTAwCgoKCgpgYGAKCiMjIyBDb25zdHJhaW50IG9mIG91dHB1dCBhdCBsZXZlbCAyClByb3BvcnRpb24gb2YgdGhlIGluaXRpYWwgcmFuZ2Ugb2YgbW9kZWwgb3V0cHV0IHRoYXQgaXMgY292ZXJlZCBieSBsZXZlbCAyIGNvbnN0cmFpbmVkIGVuc2VtYmxlICglKToKYGBge3J9CnByaW50KHJvdW5kKHJhbmdlX3Byb3BfYWxsX3dhdmVzX2xldmVsMiwxKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKYGBgCgoKCmBgYHtyLCBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0ID0gOH0KCnBkZihmaWxlID0gImZpZ3MvaW5kdWNlZF9jb25zdHJhaW50X2JhcnBsb3QucGRmIikKcmFuZ2VfcHJvcF9yb3VuZCA9IHJvdW5kKHJhbmdlX3Byb3BfYWxsX3dhdmVzX2xldmVsMiwxKQpyYW5nZV9wcm9wX3JvdW5kX21hdCA8LSByYmluZChyYW5nZV9wcm9wX3JvdW5kLCAoMTAwIC0gcmFuZ2VfcHJvcF9yb3VuZCkpCgpyYW5nZV9wcm9wX2Fub21fcm91bmQgPSByb3VuZChyYW5nZV9wcm9wX2FsbF93YXZlc19hbm9tX2xldmVsMiwxKQpyYW5nZV9wcm9wX2Fub21fcm91bmRfbWF0IDwtIHJiaW5kKHJhbmdlX3Byb3BfYW5vbV9yb3VuZCwgKDEwMCAtIHJhbmdlX3Byb3BfYW5vbV9yb3VuZCkpCgpwYXIobGFzID0gMSwgbWFyID0gYyg4LDEsMywyKSwgbWZyb3cgPSBjKDEsMiksIG9tYSA9IGMoMSwxMCwgMSwxKSkKYjEgPC0gYmFycGxvdCh0KGFwcGx5KHJhbmdlX3Byb3Bfcm91bmRfbWF0LDEscmV2KSksIAogICAgICAgIGhvcml6ID0gVFJVRSwKICAgICAgICBjb2wgPSAgYyggemJsdWUsIHpyZWQpLAogICAgICAgIHhsYWIgPSAnRW5zZW1ibGUgb3V0cHV0IHJhbmdlICglKScsCiAgICAgICAgbWFpbiA9ICdBYnNvbHV0ZScKICAgICAgICApCnRleHQoMCwgcmV2KGIxKSwgcmFuZ2VfcHJvcF9yb3VuZCwgcG9zID0gNCwgY2V4ID0gMC45KQoKYjIgPC0gYmFycGxvdCh0KGFwcGx5KHJhbmdlX3Byb3BfYW5vbV9yb3VuZF9tYXQsMSxyZXYpKSwgCiAgICAgICAgaG9yaXogPSBUUlVFLAogICAgICAgIGNvbCA9ICBjKCB6Ymx1ZSwgenJlZCksCiAgICAgICAgeGxhYiA9ICdFbnNlbWJsZSBvdXRwdXQgcmFuZ2UgKCUpJywKICAgICAgICBuYW1lcy5hcmcgPSByZXAoJycsIDEzKSwKICAgICAgICBtYWluID0gJ0Fub21hbHknCiAgICAgICAgKQp0ZXh0KDAsIHJldihiMiksIHJhbmdlX3Byb3BfYW5vbV9yb3VuZCwgcG9zID0gNCwgY2V4ID0gMC45KQoKYXhpcygxKQpyZXNldCgpCmxlZ2VuZCgnYm90dG9tJywgbGVnZW5kID0gYygnTlJPWScsICdSdWxlZCBvdXQnKSwgZmlsbCA9IGMoemJsdWUsIHpyZWQpLCBob3JpeiA9IFRSVUUsIGluc2V0ID0gMC4wMiApCmRldi5vZmYoKQoKCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5oZWlnaHQgPSA4fQoKCmF4YXQgPSBsZW5ndGgocmFuZ2VfcHJvcF9yb3VuZCk6MQoKcGFyKGxhcyA9IDEsIG1hciA9IGMoNSwxMCwzLDIpLCB4YXhzID0gJ2knKQpwbG90KHJldihyYW5nZV9wcm9wX3JvdW5kKSwgYXhhdCwgeGxpbSA9IGMoMCwxMDApLCBheGVzID0gRkFMU0UsIHR5cGUgPSAnbicsIHlsYWIgPSAnJywgeGxhYiA9ICdMZXZlbCAyIE5ST1kgcHJvcG9ydGlvbiBvZiB3aG9sZSByYW5nZSAoJSknKQojYWJsaW5lKGggPSBheGF0LCBjb2wgPSAnZ3JleScsIGx0eSA9ICdkYXNoZWQnKQojYWJsaW5lKHYgPSAxMDApCnBvaW50cyhyZXYocmFuZ2VfcHJvcF9hbm9tX3JvdW5kKSwgcmV2KGF4YXQpLCBjb2wgPSAnZ3JleScsIHBjaCA9IDE5KQpzZWdtZW50cyh4MCA9IDAsIHkwID0gcmV2KGF4YXQpLCB4MSA9IHJldihyYW5nZV9wcm9wX2Fub21fcm91bmQpLCB5MSA9IHJldihheGF0KSwgY29sID0gJ2dyZXknLCBsdHkgPSAnZGFzaGVkJykKCgpwb2ludHMocmV2KHJhbmdlX3Byb3Bfcm91bmQpLCByZXYoYXhhdCksIGNvbCA9ICdibGFjaycsIHBjaCA9IDE5KQpzZWdtZW50cyh4MCA9IDAsIHkwID0gcmV2KGF4YXQpLCB4MSA9IHJldihyYW5nZV9wcm9wX3JvdW5kKSwgeTEgPSByZXYoYXhhdCkpCiNzZWdtZW50cyh4MCA9IDAsIHkwID0gcmV2KGF4YXQpLCB4MSA9IHJldihyYW5nZV9wcm9wX2Fub21fcm91bmQpLCB5MSA9IHJldihheGF0KSwgY29sID0gJ2dyZXknLCBsdHkgPSAnZGFzaGVkJykKCmF4aXMoMiwgYXQgID0gYXhhdCwgbGFiZWxzID0gc2VsZWN0ZWRfdGFncykKYXhpcygxKQpyZXNldCgpCmxlZ2VuZCgndG9wJywgYygnQWJzb2x1dGUnLCAnQW5vbWFseScpLCBwY2ggPSAxOSwgY29sID0gYygnYmxhY2snLCAnZ3JleScpLCBob3JpeiA9IFRSVUUsIGluc2V0ID0gMC4wMykKCgpgYGAKCgojIyMgUGFpcnMgcGxvdCBvZiAyZCBwcm9qZWN0aW9ucyBvZiBjb25zdHJhaW5lZCBvdXRwdXQgc3BhY2UuCgpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0KI3BkZihmaWxlID0gJ2ZpZ3Mvb3V0cHV0X3BhaXJzLnBkZicsIHdpZHRoID0gMTAsIGhlaWdodCA9IDEwKQpwYWlycyhhbGxfd2F2ZXNfbXYsIGNvbCA9IGFsbF93YXZlc19sZXZlbDJfY29sLCBsb3dlci5wYW5lbCA9IE5VTEwsIGdhcCA9IDAsCiAgICAgIHBjaCA9IDIwLAogICAgICBsYWJlbHMgPSAxOjEzCiAgICAgICkKcmVzZXQoKQpsZWdlbmQoJ3RvcGxlZnQnLCBsZWdlbmQgPSBjKCdOUk9ZJywgJ1J1bGVkIG91dCcgKSwgcGNoID0gMjAsIGNvbCA9IGMoemJsdWUsIHpyZWQpLCBpbnNldCA9IGMoMC4wMywgMC4yNSkpCmxlZ2VuZCgnbGVmdCcsIGxlZ2VuZCA9IGMocGFzdGUoMToxMywgY29sbmFtZXMoYWxsX3dhdmVzX212KSkpLCBpbnNldCA9IDAuMDMsIGNleCA9IDEpCiNkZXYub2ZmKCkKCgpgYGAKCgoKCiMjIENvbnN0cmFpbmluZyB0byBsZXZlbCAyIHdpdGggdGhlIGVtdWxhdG9yCgoKCmBgYHtyfQpudW5pZiA8LSA1MDAwMApYX3VuaWYgPC0gc2FtcF91bmlmKG51bmlmLCBtaW5zID0gcmVwKDAsMzIpLCBtYXhlcyA9IHJlcCgxLCAzMikpCmNvbG5hbWVzKFhfdW5pZikgPC0gY29sbmFtZXMoWCkKYGBgCgoKCmBgYHtyfQoKIyBDYW4gdGhpcyBnbyBpbiBjb21tb24gZGF0YT8gV291bGQgYmUgbmVlZGVkIGZvciBjaGVja2luZyBlbXVsYXRvciBmaXRzCiMgQ3JlYXRlIGZpdCBsaXN0cyBmb3IgdGhlIGNvbWJpbmVkIGRhdGEgd2F2ZTAwIGxldmVsIDFhIGFuZCB3YXZlMDEKWV9jb25zdF9sZXZlbDFhX3dhdmUwMV9zY2FsZWRfbGlzdCA8LSBtYXQybGlzdChZX2NvbnN0X2xldmVsMWFfd2F2ZTAxX3NjYWxlZCkKCmZpdF9saXN0X2NvbnN0X2xldmVsMWFfd2F2ZTAxIDwtIG1jbGFwcGx5KFggPSBZX2NvbnN0X2xldmVsMWFfd2F2ZTAxX3NjYWxlZF9saXN0ICwgRlVOID0ga20sIGZvcm11bGEgPSB+LiwgZGVzaWduID0gWF9sZXZlbDFhX3dhdmUwMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYy5jb3JlcyA9IDQsIGNvbnRyb2wgPSBsaXN0KHRyYWNlID0gRkFMU0UpKQoKCmBgYAoKCmBgYHtyfQoKWV9jb25zdF9sZXZlbDFhX3dhdmUwMV9zY2FsZWRfcHJlZCA8LSBtdWx0aVByZWQoWSA9IFlfY29uc3RfbGV2ZWwxYV93YXZlMDFfc2NhbGVkLCBYcHJlZCA9IFhfdW5pZiwgZml0X2xpc3QgPSBmaXRfbGlzdF9jb25zdF9sZXZlbDFhX3dhdmUwMSkKCmBgYAoKCgpgYGB7cn0KCgpsZXZlbDJfaXhfZW1fdW5pZl93YXZlMDBfd2F2ZTAxIDwtIHdoaWNoKFlfY29uc3RfbGV2ZWwxYV93YXZlMDFfc2NhbGVkX3ByZWQkcHJlZF9tZWFuWywnbmJwX2xuZF9zdW0nXSA+IDAgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWV9jb25zdF9sZXZlbDFhX3dhdmUwMV9zY2FsZWRfcHJlZCRwcmVkX21lYW5bLCducHBfbmxpbV9sbmRfc3VtJ10gPiAzNSAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWV9jb25zdF9sZXZlbDFhX3dhdmUwMV9zY2FsZWRfcHJlZCRwcmVkX21lYW5bLCducHBfbmxpbV9sbmRfc3VtJ10gPCA4MCAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZX2NvbnN0X2xldmVsMWFfd2F2ZTAxX3NjYWxlZF9wcmVkJHByZWRfbWVhblssJ2NTb2lsX2xuZF9zdW0nXSA+IDc1MCAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZX2NvbnN0X2xldmVsMWFfd2F2ZTAxX3NjYWxlZF9wcmVkJHByZWRfbWVhblssJ2NTb2lsX2xuZF9zdW0nXSA8IDMwMDAgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWV9jb25zdF9sZXZlbDFhX3dhdmUwMV9zY2FsZWRfcHJlZCRwcmVkX21lYW5bLCdjVmVnX2xuZF9zdW0nXSA+IDMwMCAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWV9jb25zdF9sZXZlbDFhX3dhdmUwMV9zY2FsZWRfcHJlZCRwcmVkX21lYW5bLCdjVmVnX2xuZF9zdW0nXSA8IDgwMAopCgoKKGxlbmd0aChsZXZlbDJfaXhfZW1fdW5pZl93YXZlMDBfd2F2ZTAxKSAvIG51bmlmKSAqIDEwMAoKYGBgCgoKYGBge3J9Clhfc3Rhbl9ub3JtIDwtIG5vcm1hbGl6ZShtYXRyaXgocmVwKDEsIDMyKSwgbnJvdyA9IDEpLCB3cnQgPSBsaHMpCgpjb2xuYW1lcyhYX3VuaWYpIDwtIDE6MzIKCmBgYAoKCmBgYHtyLGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTIsIHdhcm5pbmcgPSBGQUxTRX0KCiNwZGYoZmlsZSA9ICdmaWdzL2ZpZzA2LnBkZicsIHdpZHRoID0gMTIsIGhlaWdodCA9IDEyKQojcGRmKGZpbGUgPSAnZmlncy9wYWlyc19sZXZlbDJfaXhfZW1fdW5pZl93YXZlMDBfd2F2ZTAxLnBkZicsIHdpZHRoID0gMTIsIGhlaWdodCA9IDEyKQoKcGFyKG9tYSA9IGMoMCwwLDAsMyksIGJnID0gJ3doaXRlJykKCnBhbmVsX2hpc3RfbG9jYWwgPC0gZnVuY3Rpb24oeCwgLi4uKQp7CiAgICB1c3IgPC0gcGFyKCJ1c3IiKTsgb24uZXhpdChwYXIodXNyKSkKICAgIHBhcih1c3IgPSBjKHVzclsxOjJdLCAwLCAxLjUpICkKICAgIGggPC0gaGlzdCh4LCBwbG90ID0gRkFMU0UpCiAgICBicmVha3MgPC0gaCRicmVha3M7IG5CIDwtIGxlbmd0aChicmVha3MpCiAgICB5IDwtIGgkY291bnRzOyB5IDwtIHkvbWF4KHkpCiAgICByZWN0KGJyZWFrc1stbkJdLCAwLCBicmVha3NbLTFdLCB5LCBjb2wgPSAiY3lhbiIsIC4uLikKfQoKcGFpcnMocmJpbmQoWF91bmlmW2xldmVsMl9peF9lbV91bmlmX3dhdmUwMF93YXZlMDEsIF0sIFhfc3Rhbl9ub3JtKSwKICAgICAgZ2FwID0gMCwgbG93ZXIucGFuZWwgPSBOVUxMLCB4bGltID0gYygwLDEpLCB5bGltID0gYygwLDEpLAogICAgICBwYW5lbCA9IGRmdW5jX3VwX3RydXRoLAogICAgICBkaWFnLnBhbmVsID0gcGFuZWxfaGlzdF9sb2NhbCwKICAgICAgY2V4LmxhYmVscyA9IDEsCiAgICAgIGNvbC5heGlzID0gJ3doaXRlJywKICAgICAgZGZ1bmNfY29sID0gcmIKICAgICAgKQoKCmltYWdlLnBsb3QobGVnZW5kLm9ubHkgPSBUUlVFLAogICAgICAgICAgIHpsaW0gPSBjKDAsMSksCiAgICAgICAgICAgY29sID0gcmIsCiAgICAgICAgICAgbGVnZW5kLmFyZ3MgPSBsaXN0KHRleHQgPSAnRGVuc2l0eSBvZiBtb2RlbCBydW5zIG1hdGNoaW5nIHRoZSBjcml0ZXJpYScsIHNpZGUgPSAzLCBsaW5lID0gMSksCiAgICAgICAgICAgbGVnZW5kLnNocmluayA9IDAuNiwKICAgICAgICAgICBob3Jpem9udGFsID0gVFJVRQopCgpsZWdlbmQoJ2xlZnQnLCBsZWdlbmQgPSBwYXN0ZSgxOjMyLCBjb2xuYW1lcyhsaHMpKSwgY2V4ID0gMSwgYnR5ID0gJ24nKQoKI2Rldi5vZmYoKQpgYGAKCgoKCg==